package service

import (
	"gorm.io/gorm"
	"todo/model"
	"todo/pkg/utils"
	"todo/serializer"
)

// 避免一个个的通过方法去获取：数据绑定，就是将传递的参数绑定到结构体上。可以在结构体上打上标签，对传递的参数值进行校验
// 如果前端提交的是form数据，则会进行form标签的校验；如果提交的是json数据，则会进行json标签的的校验。
type UserService struct {
	UserName string `form:"user_name" json:"user_name" binding:"required,min=3,max=15"`
	Password string `form:"password" json:"password" binding:"required,min=5,max=16"`
}

// 注册
// 返回JSON格式
func (service *UserService) Register() serializer.Response {
	var user model.User
	var count int64
	model.DB.Model(&model.User{}).Where("username=?", service.UserName).First(&user).Count(&count)
	if count == 1 {
		return serializer.Response{
			Status: 400,
			Msg:    "已经存在用户，无需再注册",
		}
	}
	user.Username = service.UserName
	// 密码加密
	if err := user.SetPassword(service.Password); err != nil {
		return serializer.Response{
			Status: 400,
			Msg:    err.Error(),
		}
	}
	// 创建用户
	if err := model.DB.Create(&user).Error; err != nil {
		return serializer.Response{
			Status: 500,
			Msg:    "数据库操作错误",
		}
	}
	return serializer.Response{
		Status: 200,
		Msg:    "注册成功",
	}
}

func (service *UserService) Login() serializer.Response {
	var user model.User
	// 先去找下这个user，看数据库有没有这个人
	if err := model.DB.Where("username=?", service.UserName).First(&user).Error; err != nil {
		if err == gorm.ErrRecordNotFound {
			return serializer.Response{
				Status: 400,
				Msg:    "用户不存在，请先注册",
			}
		}
		// 如果是其他错误
		return serializer.Response{
			Status: 500,
			Msg:    "数据库错误",
		}
	}
	if user.CheckPassword(service.Password) == false {
		return serializer.Response{
			Status: 400,
			Msg:    "密码错误",
		}
	}
	// 发一个token，为了其他功能需要身份验证所给前端存储的。
	// 创建一个备忘录，这个功能需要token，不然不知道是谁创建的
	//"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MywidXNlcl9uYW1lIjoiODg4IiwicGFzc3dvcmQiOiIxMjM0NTYiLCJleHAiOjE2NjQ4OTAyNjIsImlzcyI6InRvZG9fbGlzdCJ9.kagdoX-Iq_CoI6asv5XZ_VYPxPSl_N6ZYVow2MOJ730"
	token, err := utils.GenerateToken(user.ID, service.UserName)
	if err != nil {
		return serializer.Response{
			Status: 500,
			Msg:    "token签发错误",
		}
	}
	return serializer.Response{
		Status: 200,
		Data: serializer.TokenData{
			User:  serializer.BuildUser(user),
			Token: token,
		},
		Msg: "登录成功",
	}
}
